МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
Інститут післядипломної освіти
ЗВІТ
Про виконання лабораторної роботи №5
«Створення клієнт/серверних програм за допомогою бібліотек C#»
з дисципліни «Програмне забеспечення мережевих технологій»
Тема роботи: Створення клієнт/серверних програм за допомогою бібліотек C#
Мета роботи: Навчитись концепціям програмування мовою C#, а також засвоїти основні стандартні класи і методи бібліотеки .net.
1. Хід роботи
Завдання:
Розробити сценарій взаємодії двох програм. Вибрати необхідні класи та методи. Вибрати структури даних. Запрограмувати два мережних модуля обміну файлами, а саме:
1. Розробити механізм читання вхідного файлу та його рзміщенння;
2. Спроектувати структури для зберіганння даних;
3. Формалізувати алгоритм. Вибрати класи та методи для реалізації;
4. Створити візуальні засоби.
Сервер побудуємо синхронно, так щоб, виконання потоку блокувалося, поки сервер не дасть згоди на з'єднання з клієнтом. Клієнт завершує з'єднання, відправляючи серверу повідомлення <TheEnd>.
Сервер TCP
Перший крок полягає у встановленні для сокета локальної кінцевої точки . Перш ніж відкривати сокет для очікування з'єднань, потрібно підготувати для нього адресу локальної кінцевої точки. Унікальний адресу для обслуговування TCP / IP визначається комбінацією IP- адреси хоста з номером порту обслуговування, яка створює кінцеву точку для обслуговування.
Клас Dns надає методи, які повертають інформацію про мережевих адресах, підтримуваних пристроєм в локальній мережі. Якщо у пристрої локальної мережі є більше одного мережевого адреси, клас Dns повертає інформацію про всі мережевих адресах, і додаток повинен вибрати з масиву відповідну адресу для обслуговування.
Створимо IPEndPoint для сервера, комбінуючи перший IP-адреса хост- комп'ютера, отриманий від методу Dns.Resolve ( ) , з номером порту :
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
Тут клас IPEndPoint представляє localhost на порту 11000. Далі новим екземпляром класу Socket створюємо потоковий сокет. Встановивши локальну кінцеву точку для очікування з'єднань, можна створити сокет:
Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Перерахування AddressFamily вказує схеми адресації , які екземпляр класу Socket може використовувати для дозволу адреси.
У параметрі SocketType розрізняються сокети TCP і UDP. У ньому можна визначити в тому числі такі значення:
Dgram
Підтримує дейтаграми. Значення Dgram вимагає вказати Udp для типу протоколу і InterNetwork в параметрі сімейства адрес.
Raw
Підтримує доступ до базового транспортного протоколу .
Stream
Підтримує потокові сокети . Значення Stream вимагає вказати Tcp для типу протоколу .
Третій і останній параметр визначає тип протоколу , необхідний для сокета. У параметрі РrotocolType можна вказати наступні найбільш важливі значення - Tcp , Udp , Ip , Raw .
Наступним кроком має бути призначення сокета за допомогою методу Bind ( ) . Коли сокет відкривається конструктором , йому не призначається ім'я , а тільки резервується дескриптор . Для призначення імені сокету сервера викликається метод Bind() . Щоб сокет клієнта міг ідентифікувати потоковий сокет TCP , серверна програма повинна дати ім'я своїй сокету :
sListener.Bind(ipEndPoint);
Метод Bind () пов'язує сокет з локальною кінцевою точкою. Викликати метод Bind () треба до будь-яких спроб звернення до методів Listen () і Accept ().
Тепер, створивши сокет і зв'язавши з ним ім'я, можна слухати вхідні повідомлення, скориставшись методом Listen(). У стані прослуховування сокет буде очікувати вхідної спроби з'єднання:
sListener.Listen(10);
В параметрі визначається заділ (backlog) , я...